Bing Speech APIで音声ファイルをテキスト化してChatworkに投稿してみました。
1 はじめに
Bing Speech API は、Microsoft Cognitive Services のAPIの一つで、音声データをテキスト化してくれるAPIです。
https://azure.microsoft.com/ja-jp/services/cognitive-services/speech/
ドキュメント:Microsoft Speech API overview
今回は、このAPIを利用して、S3にポストされた音声データをテキスト化してChatworkに投稿するところまでをやってみました。
全体像は、以下のような感じです。
2 音声データの作成
今回、変換元の音声はデータは、AWS Pollyで作成しました。
3 APIキーの作成
Bing Speech APIを利用するためには、最初にリソースを作成してAPIキーを取得します。以下、その手順です。
- Azureポータルのインテリジェンス・分析カテゴリにあるCognitive Servicesを開きます。
- +追加 から Bing Speech API を選択します。
- 名前をつけて作成します。価格レベルはとりあえずS0にしました。
- 作成されたリソースを開いて、KeysからKEY1及びKEY2をコピーします。
4 認証トークン
Bing Speech APIの認証用のトークンは、API_KEYを使用して取得することができます。
$ curl -X POST "https://api.cognitive.microsoft.com/sts/v1.0/issueToken" -H "Content-type: application/x-www-form-urlencoded" -H "Content-Length: 0" -H "Ocp-Apim-Subscription-Key: API_KEY" > token
参考:Microsoft Speech API overview
参考:Quickstart for Bing Autosuggest API with Node.JS
5 ffmpeg
Bing Speech APIでテキスト化するには、音声ファイルの要件(ビットレート・サンプリングなど)を指定する必要があります。そこで、音声ファイルを一定の条件に揃えるためにffmpegを使用しました。
$ ffmpeg -i Mizuki.mp3 -vn -ac 2 -ar 16000 -acodec pcm_s16le -f wav Mizuki.wav
6 変換
いよいよテキスト化です。取得したトークンをAuthorizationヘッダーで渡しています。また、languageで日本語を指定しています。
$ curl -v -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&format=detailed" -H "Transfer-Encoding: chunked" -H "Authorization: Bearer `cat token`" -H "Content-type: audio/wav; codec=audio/pcm; samplerate=16000" --data-binary @Mizuki.wav
戻り値は、次のようになりました。Confidenceが一番高いものを利用すれば良い感じでしょうか。
{ "Duration": 67200000, "NBest": [ { "Confidence": 0.923073053, "Display": "こんにちはこれはamazon pollyで作成された音声ファイルです音声はみずきです", "ITN": "こんにちはこれはamazon pollyで作成された音声ファイルです音声はみずきです", "Lexical": "こんにちはこれは amazon polly で作成された音声ファイルです音声はみずきです", "MaskedITN": "こんにちはこれはamazon pollyで作成された音声ファイルです音声はみずきです" }, { "Confidence": 0.8951837, "Display": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです", "ITN": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです", "Lexical": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです", "MaskedITN": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです" }, { "Confidence": 0.8951837, "Display": "今日はこれはamazon pollyで作成された音声ファイルです音声はみずきです", "ITN": "今日はこれはamazon pollyで作成された音声ファイルです音声はみずきです", "Lexical": "今日はこれは amazon polly で作成された音声ファイルです音声はみずきです", "MaskedITN": "今日はこれはamazon pollyで作成された音声ファイルです音声はみずきです" }, { "Confidence": 0.8949905, "Display": "こんにちはこれはアマゾンpolyで作成された音声ファイルです音声はみずきです", "ITN": "こんにちはこれはアマゾンpolyで作成された音声ファイルです音声はみずきです", "Lexical": "こんにちはこれはアマゾン poly で作成された音声ファイルです音声はみずきです", "MaskedITN": "こんにちはこれはアマゾンpolyで作成された音声ファイルです音声はみずきです" }, { "Confidence": 0.8949905, "Display": "こんにちはこれはアマゾンplyで作成された音声ファイルです音声はみずきです", "ITN": "こんにちはこれはアマゾンplyで作成された音声ファイルです音声はみずきです", "Lexical": "こんにちはこれはアマゾン ply で作成された音声ファイルです音声はみずきです", "MaskedITN": "こんにちはこれはアマゾンplyで作成された音声ファイルです音声はみずきです" } ], "Offset": 600000, "RecognitionStatus": "Success" }
7 Lambda
最終的には、S3にオブジェクトがアップロードされたタイミングで動作するLambdaで上記の処理を行っています。
動作している様子です。
8 最後に
今回は、Microsoft の Bing Speech APIを利用させて頂いて、音声ファイルのテキスト化をやってみました。
近年、音声をテキスト化する手段は、いろいろ提供されていますが、今回のようにS3にドロップするだけでテキスト化する仕組みを用意しておけば、もしかすると何か利用場面があるかも知れません・・・あれば良いのですが(希望)